import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:hkzf_flutter/config.dart';
import 'package:hkzf_flutter/routes.dart';
import 'package:hkzf_flutter/scoped_model/auth_model.dart';
import 'package:hkzf_flutter/utils/common_toast.dart';
import 'package:hkzf_flutter/utils/scoped_model_helper.dart';

class DioHttp{
  Dio? _client;// 存储实际的 HTTP 客户端实例
  BuildContext? context;// 组件树中的上下文对象
  // 静态方法 of,用于获取 DioHttp 的实例
  static DioHttp of(BuildContext context){
     return DioHttp._internal(context);
  }
  //_internal命名构造函数，用于初始化 DioHttp 实例
  DioHttp._internal(BuildContext context){
    // 如果 _client 尚未初始化或者传入的 context 与当前实例的 context 不同，则重新配置 _client
    if(_client == null || context != this.context){
      this.context = context;
      var options= BaseOptions(
        baseUrl: Config.BaseUrl,// 基础 URL
        connectTimeout: const Duration(milliseconds: 10000),// 连接超时时间
        receiveTimeout: const Duration(milliseconds: 3000),// 接收超时时间
        extra: {'context':context}//用于后续请求中的上下文信息传递
      );
      var client = Dio(options);
      // 添加接口拦截器
      Interceptor interceptor = InterceptorsWrapper(onResponse: (res, handler){
        if(res == null ) return;
        // 返回状态码
        var status = json.decode(res.toString())['status'];
        if(status == 404){
          CommonToast.showToast('接口地址错误！当前接口：${res.requestOptions.path}');
        }
        if(status.toString().startsWith('4')){
          ScopedModelHelper.getModel<AuthModel>(context).logout();
          // 如果当前页面是loading页面,则不做处理
          if(ModalRoute.of(context)?.settings.name == Routes.loading){
              return handler.resolve(res);// 手动结束请求链，返回响应
          }
          CommonToast.showToast('登录已过期！请重新登录！');
          Navigator.of(context).pushNamed(Routes.login);
          // 使用 handler.resolve() 来传递处理后的响应,尝试从某个容器中获取一个对象实例来使用
          return handler.resolve(res);// 手动结束请求链，返回响应
        }
        // 使用 handler.next() 来继续处理请求，属于放行操作
        return handler.next(res);

      });
      client.interceptors.add(interceptor);
      // 创建一个新的 Dio 实例，并赋给 _client
      this._client = client;
      

    }
  }
  // get 请求封装
  Future<Response<Map<String,dynamic>>> get(String path,[Map<String,dynamic>? params,String? token]) async{
    var options = Options(headers: {
       'Authorization':token
    });
    return await _client!.get(
      path,
      // queryParameters 会自动将 params 转换成查询字符串附加到 URL 后面
      queryParameters: params,
      options: options
    );
 }
  // post 请求封装
  Future<Response<Map<String,dynamic>>> post(String path,[Map<String,dynamic>? params,String? token]) async{
    // print('正在请求 POST 接口：${_client!.options.baseUrl}$path'); // 打印完整 URL
    // print('发送的数据：$params');
    
    var options = Options(headers: {
       'Authorization':token
    });
    return await _client!.post(
      path,
      data: params,
      options: options
    );
 }
 // post提交表单 请求封装
  Future<Response<Map<String,dynamic>>> postFormData(String path,[dynamic params,String? token]) async{
    var options = Options(
      contentType: 'multipart/form-data',
      headers: {
       'Authorization':token
      }
    );
    return await _client!.post(
      path,
      data:params,
      options: options
    );
 }
}
